package com.hucsmn.studentms;

import java.io.Serializable;
import java.util.Objects;
import java.util.regex.Pattern;

/**
 * 学生信息类。
 */
public class Student implements Comparable<Student>, Serializable {
    private static final long serialVersionUID = -5149947366176601515L;

    private static final Pattern REGEX_SPACE = Pattern.compile("\\s+");

    // 学号。
    private final int number;

    // 姓名。
    private final String name;

    // 年龄。
    private final int age;

    private Student(int number) throws IllegalStudentException {
        this.number = number;
        this.name = null;
        this.age = 0;
    }

    public Student(int number, String name, int age) throws IllegalStudentException {
        if (number < 0) {
            throw new IllegalStudentException("学号小于零！");
        }
        if (name == null || name.length() == 0) {
            throw new IllegalStudentException("姓名为空！");
        }
        if (age < 0) {
            throw new IllegalStudentException("年龄小于零！");
        }
        this.number = number;
        this.name = name;
        this.age = age;
    }

    /**
     * 从文本解析学生记录。
     *
     * @param literal 学生信息文本，空格隔开。
     * @return 学生信息。
     * @throws IllegalStudentException 学生信息格式不正确时抛出。
     */
    public static Student parse(String literal) throws IllegalStudentException {
        String[] fields = REGEX_SPACE.split(literal, 3);
        return parse(fields);
    }

    /**
     * 从字符串数组解析学生记录。
     *
     * @param fields 学生信息中每个成员的值的字符串，按顺序排列。
     * @return 学生信息。
     * @throws IllegalStudentException 学生信息格式不正确时抛出。
     */
    public static Student parse(String[] fields) throws IllegalStudentException {
        return parse(fields, 0, fields.length);
    }

    /**
     * 从字符串数组中特定位置，解析学生记录。
     *
     * @param fields 学生信息中每个成员的值的字符串，按顺序排列。
     * @param offset 从第几个元素开始。
     * @param length 一共的元素数。
     * @return 学生信息。
     * @throws IllegalStudentException 学生信息格式不正确时抛出。
     */
    public static Student parse(String[] fields, int offset, int length) throws IllegalStudentException {
        if (offset < 0 || offset > fields.length || length != 3 || offset + length > fields.length) {
            throw new IllegalStudentException("参数数目不正确！");
        }
        try {
            int number = Integer.parseInt(fields[offset]);
            String name = fields[offset + 1];
            int age = Integer.parseInt(fields[offset + 2]);
            return new Student(number, name, age);
        } catch (NumberFormatException e) {
            throw new IllegalStudentException("参数格式不正确！");
        }
    }

    static Student getSearchKey(int number) {
        return new Student(number);
    }

    public int getNumber() {
        return number;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    @Override
    public boolean equals(Object o) {
        // 按学号比较。
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return number == student.number;
    }

    @Override
    public int hashCode() {
        // 按学号比较。
        return Objects.hash(number);
    }

    @Override
    public int compareTo(Student o) {
        // 按学号比较。
        int c0, c1;
        return c0 = Integer.compare(number, o.number);
    }

    @Override
    public String toString() {
        final StringBuilder sb = new StringBuilder("【");
        sb.append("学号 ").append(number);
        sb.append("，姓名 '").append(name).append('\'');
        sb.append("，年龄 ").append(age);
        sb.append("】");
        return sb.toString();
    }
}

